import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class Kiirendus extends JPanel implements ActionListener {

	JButton tagasi;
	JPanel ylemine, sisu, andmed;
	JTextField kiirus, kiirendus;
	JLabel kysimus, kysimus2, tyhjus, tyhjus2, kysimus_;
	JButton alusta, nulli;
	Timer timer;
	int w, h, kiirus2 = 10, hetk = 0, algkiirus = 0;
	double kiirus_start, kiirus_hetk, kiirendus_hetk, aeg_hetk, edasi = 0.0;

	public Kiirendus() {

		setLayout(new BorderLayout(3, 3));

		ylemine = new JPanel();
		ylemine.setLayout(new FlowLayout(FlowLayout.LEFT));
		tagasi = new JButton("<< TAGASI");
		tagasi.addActionListener(this);
		ylemine.add(tagasi);
		ylemine.setBorder(BorderFactory.createEtchedBorder());
		add(ylemine, BorderLayout.NORTH);

		timer = new Timer(kiirus2, new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				aeg_hetk += 0.01;
				kiirus_hetk = kiirus_start + kiirendus_hetk * aeg_hetk;
				edasi = kiirus_start * aeg_hetk + kiirendus_hetk
						* (Math.pow(aeg_hetk, 2.)) / 2.;
				hetk = (int) (kiirus_hetk / 2.34);
				repaint();

			}
		});

		sisu = new JPanel() {

			public void paintComponent(Graphics g) {
				ImageIcon auto = null;
				try {
					auto = Ikoonilaadija.annaIkoon("kauto.jpg");
				} catch (Exception e) {
					System.out.println("mingi porr");
				}
				w = getWidth();
				h = getHeight();
				g.drawLine(0, h / 5, w, h / 5);
				g.drawImage(auto.getImage(), (int) (w / 40 * edasi / 100), h / 9-1, (int) (w
						/ 40 * edasi / 100)
						+ w / 12, h / 9 + h / 11-1, 0, 0, 48, 48, null);
				int aste = 0;
				for (int i = 0; i < 31; i++) {
					if (i == 0 || i == 10 || i == 20 || i == 30) {
						g.drawLine(w / 12 + aste, h / 5 - h / 25,
								w / 12 + aste, h / 5 + h / 25);
						if (i != 0) {
							g.drawString(String.valueOf(i * 100) + " m", w / 15
									+ aste, h / 5 + h / 15);
						} else {
							g.drawString(String.valueOf(i) + " m", w / 15
									+ aste, h / 5 + h / 15);
						}
					} else {
						g.drawLine(w / 12 + aste, h / 5 - h / 50,
								w / 12 + aste, h / 5 + h / 50);
					}
					aste += w / 40;
				}

				g.setColor(Color.green);
				int r = w / 6;
				int x = 0, y = 0, last_x = 0, last_y = 0, first_x = 0, first_y = 0, counter = 0;
				algkiirus = 0;

				for (double t = -Math.PI - Math.PI / 5; t < Math.PI - Math.PI
						/ 5; t += Math.PI / 128) {
					x = (int) (r * Math.cos(t) + w / 5);
					y = (int) (r * Math.sin(t) + h / 2 + h / 4);
					// g.drawLine(w / 5, h / 2 + h / 4, x, y);
					if (t == -Math.PI - Math.PI / 5) {
						first_x = x;
						first_y = y;
					}

					if (last_x != 0
							&& (t < Math.PI / 5 || t > Math.PI - Math.PI / 5)) {
						g.drawLine(last_x, last_y, x, y);

					}
					if (counter % 8 == 0
							&& (t < Math.PI / 5 || t > Math.PI - Math.PI / 5)) {
						int muutuja1 = 0, muutuja2 = 0;
						if (t > -Math.PI && t <= -Math.PI + 0.8) {
							muutuja1 = 4;
							muutuja2 = 1;
						}
						if (t > -Math.PI + 0.8 && t <= -Math.PI + 1.6) {
							muutuja1 = 3;
							muutuja2 = 9;
						}
						if (t > -Math.PI + 1.6 && t <= -Math.PI + 2.1) {
							muutuja1 = -1;
							muutuja2 = 12;
						}
						if (t > -Math.PI + 2.1 && t <= -Math.PI + 2.4) {
							muutuja1 = -10;
							muutuja2 = 12;
						}
						if (t > -Math.PI + 2.4 && t <= 0) {
							muutuja1 = -20;
							muutuja2 = 7;
						}
						if (t > 0) {
							muutuja1 = -20;
							muutuja2 = 5;
						}
						g.drawString(String.valueOf(algkiirus), x + muutuja1, y
								+ muutuja2);
						algkiirus += 20;
						muutuja1 = 0;
						muutuja2 = 0;
					}
					last_x = x;
					last_y = y;
					if (t > 3.) {
						g.drawLine(last_x, last_y, first_x, first_y);
					}
					counter++;
					if (counter == hetk && hetk < 188) {
						g.setColor(Color.RED);
						g.drawLine(w / 5, h / 2 + h / 4, x, y);
						g.setColor(Color.green);
					}

				}
				if (timer.isRunning()) {
					g.setColor(Color.BLUE);
					g.drawString("Kulunud aeg        "
							+ String.valueOf(((int) (aeg_hetk * 100)) / 100.)
							+ " s", w / 2, h / 2 + h / 10);
					g.drawString("Masina kiirendus:  "
							+ String.valueOf(kiirendus_hetk) + " m/s\u00b2",
							w / 2, h / 2 + h / 5);
					g
							.drawString(
									"Masina kiirus:     "
											+ String
													.valueOf(((int) (kiirus_hetk * 100)) / 100.)
											+ " m/s", w / 2, h / 2 + h / 10 + h
											/ 5);
					g.drawString("Läbitud maa:       "
							+ String.valueOf(((int) (edasi * 100)) / 100.)
							+ " m", w / 2, h / 2 + h / 10 + h / 10 + h / 5);
				}

			}
		};
		sisu.setBorder(BorderFactory.createEtchedBorder());
		add(sisu, BorderLayout.CENTER);

		andmed = new JPanel();
		andmed.setLayout(new GridLayout(15, 1, 1, 1));
		kysimus = new JLabel("Sisesta masina algkiirus(m/s):");
		kysimus_ = new JLabel("(vahemikus 1.0 kuni 200.0)");
		kiirus = new JTextField("40.0");
		tyhjus = new JLabel("");
		kysimus2 = new JLabel("Sisesta masina kiirendus(m/s\u00b2):");
		kiirendus = new JTextField("5.0");
		tyhjus2 = new JLabel("");
		alusta = new JButton("Alusta");
		alusta.addActionListener(this);
		nulli = new JButton("Nulli");
		nulli.addActionListener(this);
		andmed.add(kysimus);
		andmed.add(kiirus);
		andmed.add(kysimus_);
		andmed.add(tyhjus);
		andmed.add(kysimus2);
		andmed.add(kiirendus);
		andmed.add(tyhjus2);
		andmed.add(alusta);
		andmed.add(nulli);
		andmed.setBorder(BorderFactory.createEtchedBorder());
		add(andmed, BorderLayout.EAST);

	}

	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand() == "<< TAGASI") {
			this.setVisible(false);
			nulli();
		}
		if (e.getActionCommand() == "Alusta") {
			try {
				kiirus_start = Double.parseDouble(kiirus.getText());
				if (kiirus_start < 0.0) {
					kiirus_start = 0.1;
					kiirus.setText("0.1");
				}
				if (kiirus_start > 200.0) {
					kiirus_start = 200.0;
					kiirus.setText("200.0");
				}
			} catch (Exception error) {
				kiirus.setText("40.0");
				return;
			}
			try {
				kiirendus_hetk = Double.parseDouble(kiirendus.getText());
				if (kiirendus_hetk < -40.) {
					kiirendus_hetk = -40.;
					kiirendus.setText("-40.0");
				}
				if (kiirendus_hetk > 50.) {
					kiirendus_hetk = 50.;
					kiirendus.setText("50.0");
				}
			} catch (Exception err) {
				kiirendus_hetk = 5.0;
				return;
			}
			kiirus.setEnabled(false);
			kiirendus.setEnabled(false);
			alusta.setEnabled(false);
			aeg_hetk = 0.000;
			timer.start();
			repaint();
		}
		if (e.getActionCommand() == "Nulli") {
			nulli();
		}

	}

	public void nulli() {
		timer.stop();
		edasi = 0.0;
		kiirus_start = 0.0;
		kiirendus_hetk = 0.0;
		hetk = 0;
		aeg_hetk = 0;
		algkiirus = 0;
		kiirus.setEnabled(true);
		kiirendus.setEnabled(true);
		alusta.setEnabled(true);
		repaint();
	}

}
